package main
import (
	"fmt"
	"time"
)
func recoverName() {
	if r := recover(); r != nil {
		fmt.Println("recoverName == > recovered from", r)
	}
}
func fullName(firstName *string, lastName *string) {
	defer recoverName()
	if firstName == nil {
		panic("runtime error: first name cannot be nil")
	}
	if lastName == nil {
		panic("runtime error: last name cannot be nil")
	}
	fmt.Printf("%s %s \n", *firstName, *lastName)
	fmt.Println("returned normally from fullName")
}

//   32. panic 和 recover 需要注意的是，你应该尽可能地使用错误，而不是使用 panic 和 recover。只有当程序不能继续运行的时候，才应该使用 panic 和 recover 机制
func main(){
	// defer fmt.Println("main ==> deferred call in main")
	// firstName := "yang"
	// fullName(&firstName,nil)
	// fmt.Println("returned normally from main")

	// panic，recover 和 Go 协程
	fmt.Println("================")
	a()
    fmt.Println("main aaaa => normally returned from main")
}


// panic，recover 和 Go 协程
func recovery() {
	if r := recover(); r != nil {
		fmt.Println("recovery", r)
	}
}
func a(){
	defer recovery()
	fmt.Println("Inside A")
	go b()
	time.Sleep(1 * time.Second)
}
func b() {
	fmt.Println("Inside B")
	panic("oh! B panicked")
}
